home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 July: Mac OS SDK / Dev.CD Jul 96 SDK / Dev.CD Jul 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc Development Framework / ODFDev / ODF / Found / FWStream / Sources / SLObjReg.cpp < prev    next >
Encoding:
Text File  |  1996-04-25  |  8.8 KB  |  287 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                SLObjReg.cpp
  4. //    Release Version:    $ ODF 1 $
  5. //
  6. //    Copyright:    (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #include "FWFound.hpp"
  11.  
  12. #ifndef   FWPRIDEB_H
  13. #include "FWPriDeb.h"
  14. #endif
  15.  
  16. #ifndef   FWPRIMEM_H
  17. #include "FWPriMem.h"
  18. #endif
  19.  
  20. #ifndef SLMEMMGR_H
  21. #include "SLMemMgr.h"
  22. #endif
  23.  
  24. #ifndef FWODEXCE_H
  25. #include "FWODExce.h"
  26. #endif
  27.  
  28. #define SOM_Module_slobjreg_Source
  29. #include <SLObjReg.xih>
  30.  
  31. #ifdef FW_BUILD_MAC
  32. #pragma segment FWArchiv
  33. #endif
  34.  
  35. static void growList(FW_OBasicObjectRegistryData *somThis);
  36.  
  37.  
  38. //----------------------------------------------------------------------------------------
  39. //    FW_OObjectRegistry__RegisterObject
  40. //----------------------------------------------------------------------------------------
  41. /*
  42.  *  Register an object and returns the (unique) ID
  43.  */
  44. SOM_Scope FW_ObjectRegistry_ID  SOMLINK FW_OObjectRegistry__RegisterObject(FW_OObjectRegistry *somSelf, Environment *ev,
  45.         void* object)
  46. {
  47. FW_UNUSED(somSelf);
  48. FW_UNUSED(ev);
  49. FW_UNUSED(object);
  50.     return FW_kNotInRegistry;
  51. }
  52.  
  53.  
  54. //----------------------------------------------------------------------------------------
  55. //    FW_OObjectRegistry__RegisterObjectAndID
  56. //----------------------------------------------------------------------------------------
  57. /*
  58.  *  Register an object to particular id.
  59.  *  The id must not already be in the registry.
  60.  */
  61. SOM_Scope void  SOMLINK FW_OObjectRegistry__RegisterObjectAndID(FW_OObjectRegistry *somSelf, Environment *ev,
  62.         void* object,
  63.         FW_ObjectRegistry_ID id)
  64. {
  65. FW_UNUSED(somSelf);
  66. FW_UNUSED(ev);
  67. FW_UNUSED(object);
  68. FW_UNUSED(id);
  69. }
  70.  
  71.  
  72. //----------------------------------------------------------------------------------------
  73. //    FW_OObjectRegistry__LookupByObject
  74. //----------------------------------------------------------------------------------------
  75. /*
  76.  *  Look up an object in the registry, return kNonInRegistry if object not found.
  77.  */
  78. SOM_Scope FW_ObjectRegistry_ID  SOMLINK FW_OObjectRegistry__LookupByObject(FW_OObjectRegistry *somSelf, Environment *ev,
  79.         void* object)
  80. {
  81. FW_UNUSED(somSelf);
  82. FW_UNUSED(ev);
  83. FW_UNUSED(object);
  84.     return FW_kNotInRegistry;
  85. }
  86.  
  87.  
  88. //----------------------------------------------------------------------------------------
  89. //    FW_OObjectRegistry__LookupByID
  90. //----------------------------------------------------------------------------------------
  91. /*
  92.  *  Find an object by ID, return its pointer.
  93.  *  Return 0 if id not in registry.
  94.  */
  95. SOM_Scope void*  SOMLINK FW_OObjectRegistry__LookupByID(FW_OObjectRegistry *somSelf, Environment *ev,
  96.         FW_ObjectRegistry_ID id)
  97. {
  98. FW_UNUSED(somSelf);
  99. FW_UNUSED(ev);
  100. FW_UNUSED(id);
  101.     return 0;
  102. }
  103.  
  104.  
  105. //----------------------------------------------------------------------------------------
  106. //    FW_OObjectRegistry__somInit
  107. //----------------------------------------------------------------------------------------
  108. SOM_Scope void  SOMLINK FW_OObjectRegistry__somInit(FW_OObjectRegistry *somSelf)
  109. {
  110.     FW_OObjectRegistry_parent_SOMObject_somInit(somSelf);
  111. }
  112.  
  113.  
  114. //----------------------------------------------------------------------------------------
  115. //    FW_OObjectRegistrysomUninit
  116. //----------------------------------------------------------------------------------------
  117. SOM_Scope void  SOMLINK FW_OObjectRegistry__somUninit(FW_OObjectRegistry *somSelf)
  118. {
  119.     FW_OObjectRegistry_parent_SOMObject_somUninit(somSelf);
  120. }
  121.  
  122.  
  123. //----------------------------------------------------------------------------------------
  124. //    FW_OBasicObjectRegistry__somInit
  125. //----------------------------------------------------------------------------------------
  126. SOM_Scope void  SOMLINK FW_OBasicObjectRegistry__somInit(FW_OBasicObjectRegistry *somSelf)
  127. {
  128.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  129.  
  130.     FW_OBasicObjectRegistry_parent_FW_OObjectRegistry_somInit(somSelf);
  131.  
  132.     somThis->fList = 0;
  133.     somThis->fListLength = 0;
  134.     somThis->fPhysicalListLength = 0;
  135.     somThis->fNextUnusedID = 1;
  136. }
  137.  
  138.  
  139. //----------------------------------------------------------------------------------------
  140. //    FW_OBasicObjectRegistry__somUninit
  141. //----------------------------------------------------------------------------------------
  142. SOM_Scope void  SOMLINK FW_OBasicObjectRegistry__somUninit(FW_OBasicObjectRegistry *somSelf)
  143. {
  144.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  145.  
  146.     FW_PrimitiveFreeBlock(somThis->fList);
  147.  
  148.     FW_OBasicObjectRegistry_parent_FW_OObjectRegistry_somUninit(somSelf);
  149. }
  150.  
  151.  
  152. //----------------------------------------------------------------------------------------
  153. //    FW_OBasicObjectRegistry__RegisterObject
  154. //----------------------------------------------------------------------------------------
  155. SOM_Scope FW_ObjectRegistry_ID  SOMLINK FW_OBasicObjectRegistry__RegisterObject(FW_OBasicObjectRegistry *somSelf, Environment *ev,
  156.         void* object)
  157. {
  158.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  159.  
  160.     FW_SOM_TRY
  161.     {
  162.         FW_ASSERT(FW_OBasicObjectRegistry__LookupByObject(somSelf, ev, object) == FW_kNotInRegistry);
  163.         if (somThis->fListLength == somThis->fPhysicalListLength)
  164.         {
  165.             growList(somThis);
  166.     //        if (ev->_major != 0)
  167.     //            return FW_kNotInRegistry;
  168.         }
  169.     
  170.         long entry = somThis->fListLength++;
  171.         somThis->fList[entry].fObject = object;
  172.         while (FW_OBasicObjectRegistry__LookupByID(somSelf, ev, somThis->fNextUnusedID) != 0)
  173.             somThis->fNextUnusedID++;
  174.         somThis->fList[entry].fID = somThis->fNextUnusedID++;
  175.  
  176.         return somThis->fList[entry].fID;
  177.     }
  178.     FW_SOM_CATCH
  179.  
  180.     return FW_kNotInRegistry;
  181. }
  182.  
  183.  
  184. //----------------------------------------------------------------------------------------
  185. //    FW_OBasicObjectRegistry__RegisterObjectAndID
  186. //----------------------------------------------------------------------------------------
  187. SOM_Scope void  SOMLINK FW_OBasicObjectRegistry__RegisterObjectAndID(FW_OBasicObjectRegistry *somSelf, Environment *ev,
  188.         void* object,
  189.         FW_ObjectRegistry_ID id)
  190. {
  191.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  192.  
  193.     FW_SOM_TRY
  194.     {
  195. //        FW_ASSERT(FW_OBasicObjectRegistry__LookupByObject(somSelf, ev, object) == FW_kNotInRegistry);
  196.         FW_ASSERT(FW_OBasicObjectRegistry__LookupByID(somSelf, ev, id) == 0);
  197.     
  198.         if (somThis->fListLength == somThis->fPhysicalListLength)
  199.             growList(somThis);
  200.     
  201.         long entry = somThis->fListLength++;
  202.         somThis->fList[entry].fObject = object;
  203.         somThis->fList[entry].fID = id;
  204.     }
  205.     FW_SOM_CATCH
  206. }
  207.  
  208.  
  209. //----------------------------------------------------------------------------------------
  210. //    FW_OBasicObjectRegistry__LookupByObject
  211. //----------------------------------------------------------------------------------------
  212. SOM_Scope FW_ObjectRegistry_ID  SOMLINK FW_OBasicObjectRegistry__LookupByObject(FW_OBasicObjectRegistry *somSelf, Environment *ev,
  213.         void* object)
  214. {
  215. FW_UNUSED(ev);
  216.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  217.  
  218.     FW_ObjectRegistry_ID result = FW_kNotInRegistry;
  219.     for (long i = 0; i < somThis->fListLength; i++)
  220.     {
  221.         if (somThis->fList[i].fObject == object)
  222.         {
  223.             result = somThis->fList[i].fID;
  224.             break;
  225.         }
  226.     }
  227.  
  228.     return result;
  229. }
  230.  
  231.  
  232. //----------------------------------------------------------------------------------------
  233. //    FW_OBasicObjectRegistry__LookupByID
  234. //----------------------------------------------------------------------------------------
  235. SOM_Scope void*  SOMLINK FW_OBasicObjectRegistry__LookupByID(FW_OBasicObjectRegistry *somSelf, Environment *ev,
  236.         FW_ObjectRegistry_ID id)
  237. {
  238. FW_UNUSED(ev);
  239.     FW_OBasicObjectRegistryData *somThis = FW_OBasicObjectRegistryGetData(somSelf);
  240.  
  241.     void* result = 0;
  242.     for (long i = 0; i < somThis->fListLength; i++)
  243.     {
  244.         if (somThis->fList[i].fID == id)
  245.         {
  246.             result = somThis->fList[i].fObject;
  247.             break;
  248.         }
  249.     }
  250.  
  251.     return result;
  252. }
  253.  
  254.  
  255. //----------------------------------------------------------------------------------------
  256. //    growList
  257. //----------------------------------------------------------------------------------------
  258. /*
  259.  *  Grow the list by kExpansion slots
  260.  */
  261. static void growList(FW_OBasicObjectRegistryData *somThis)
  262. {
  263.     const int kExpansion = 8;
  264.     long bytesNeeded = (somThis->fPhysicalListLength+kExpansion) * sizeof(FW_OBasicObjectRegistry_SAssociation);
  265.  
  266.     if (somThis->fList == 0)
  267.         somThis->fList = (FW_OBasicObjectRegistry_SAssociation*) FW_PrimitiveAllocateBlock(bytesNeeded);
  268.     else
  269.         somThis->fList = (FW_OBasicObjectRegistry_SAssociation*) FW_PrimitiveResizeBlock(somThis->fList, bytesNeeded);
  270.  
  271.     if (somThis->fList == 0)
  272.     {
  273.         somThis->fPhysicalListLength = 0;
  274.         FW_THROW(FW_XException(FW_xMemoryExhausted));
  275.     }
  276.  
  277.     for (long i = somThis->fPhysicalListLength; i < somThis->fPhysicalListLength+kExpansion; i++)
  278.     {
  279.         somThis->fList[i].fID = FW_kNotInRegistry;
  280.         somThis->fList[i].fObject = 0;
  281.     }
  282.         
  283.     somThis->fPhysicalListLength += kExpansion;
  284. }
  285.  
  286.  
  287.